package com.hjw.dynamicdatasource.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.apache.ibatis.builder.annotation.ProviderMethodResolver;

import java.util.List;
import java.util.Map;

/**
 * 动态Mapper接口，用于执行动态SQL查询和执行操作
 */
@Mapper
public interface DynamicMapper{

    /**
     * 执行动态SQL查询
     * @param sql SQL语句
     * @param params SQL参数
     * @param entityClass 实体类
     * @return 查询结果列表
     */
    @SelectProvider(type = DynamicSqlProvider.class, method = "dynamicQuery")
    <T> List<Map<String, Object>> dynamicQuery(@Param("sql") String sql, @Param("params") Map<String, Object> params, @Param("entityClass") Class<T> entityClass);
    
    /**
     * 动态执行方法（插入、更新、删除）
     * @param sql SQL语句
     * @param params SQL参数
     * @return 影响的行数
     */
    @UpdateProvider(type = DynamicSqlProvider.class, method = "dynamicExecute")
    int dynamicExecute(@Param("sql") String sql, @Param("params") Map<String, Object> params);
    
    /**
     * 动态SQL提供者
     */
    class DynamicSqlProvider implements ProviderMethodResolver {
        
        /**
         * 提供动态SQL
         * @param param 包含SQL和参数的映射
         * @return SQL语句
         */
        public String dynamicQuery(Map<String, Object> param) {
            return (String) param.get("sql");
        }
        
        /**
         * 提供动态执行SQL
         * @param param 包含SQL和参数的映射
         * @return SQL语句
         */
        public String dynamicExecute(Map<String, Object> param) {
            return (String) param.get("sql");
        }
    }
}